package com.xushu.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

@Configuration
public class ThreadPoolConfig {


    @Bean
    public ThreadPoolTaskExecutor asyncThreadPoolExecutor(){
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        // IO 密集型: cpu核心x2 +1
        threadPoolTaskExecutor.setCorePoolSize(33);
        // IO 密集型: cpu核心x4
        threadPoolTaskExecutor.setMaxPoolSize(66);
        /*如果任务是 CPU 密集型，即计算任务比较多，可以将队列大小设置为 0 或者 1
        ，这样可以让线程池及时处理任务，避免任务堆积。
        如果任务是 IO 密集型，即网络请求比较多，可以设置队列大小为 2 * 核心线程数，
        这样可以缓存一些请求，避免线程池因为等待 IO 密集型任务而阻塞。*/
        threadPoolTaskExecutor.setQueueCapacity(120);
        /*短时间任务和高频率任务：
        KeepAliveTime 可以设置为 30 秒到 1 分钟。
        长时间任务和低频率任务：
        KeepAliveTime 可以设置为 1 分钟到 5 分钟。*/
        threadPoolTaskExecutor.setKeepAliveSeconds(30);
        threadPoolTaskExecutor.setThreadNamePrefix("xushu_");
        threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        threadPoolTaskExecutor.initialize();
        return threadPoolTaskExecutor;
    }
}
